package com.zhou.base.flowable7.test.event.handlers;

import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;

/**
 * 这些可以用作基类或作为示例侦听器实现 {@link org.flowable.engine.delegate.event.BaseEntityEventListener}
 * <property name="eventListeners">
 *   <list>
 *      <bean class="org.flowable.engine.example.MyEventListener" />
 *   </list>
 * </property>
 * <property name="typedEventListeners">
 *   <map>
 *     <entry key="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" >
 *       <list>
 *         <bean class="org.flowable.engine.example.MyJobEventListener" />
 *       </list>
 *     </entry>
 *   </map>
 * </property>
 *
 * 分派事件的顺序由添加侦听器的顺序决定。首先，所有普通事件监听器按照它们在列表中定义的顺序被调用（eventListeners 属性）。
 * 之后，如果调度了正确类型的事件，则调用所有类型化事件侦听器（typedEventListeners 属性）。
 * @description:
 * @author xianfeng
 * @date 2024/1/4 20:19
 */
public class MyEventListener implements FlowableEventListener {

    @Override
    public void onEvent(FlowableEvent event) {
        if (event.getType() == FlowableEngineEventType.JOB_EXECUTION_SUCCESS) {
            System.out.println("A job well done!");
        } else if (event.getType() == FlowableEngineEventType.JOB_EXECUTION_FAILURE) {
            System.out.println("A job has failed...");
        } else {
            System.out.println("Event received: " + event.getType());
        }
    }

    /**
     * isFailOnException() 方法确定 onEvent(..) 方法在调度事件时引发异常时的行为。
     * 当返回 false 时，异常将被忽略。
     * 当返回 true 时，异常不会被忽略并且会冒泡，从而有效地使当前正在进行的命令失败。
     * 如果该事件是 API 调用（或任何其他事务操作，例如作业执行）的一部分，则事务将回滚。
     * 如果事件侦听器中的行为不是业务关键型，建议返回 false
     * @return
     */
    @Override
    public boolean isFailOnException() {
        // The logic in the onEvent method of this listener is not critical, exceptions
        // can be ignored if logging fails...
        return false;
    }

    /**
     * isFireOnTransactionLifecycleEvent() 方法确定此事件侦听器是在事件发生时立即触发，
     * 还是在 getOnTransaction()方法确定的事务生命周期事件上立即触发。
     * 事务生命周期事件支持的值为：COMMITTED、ROLLED_BACK、COMMITTING、ROLLINGBACK。
     * @return
     */
    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        return false;
    }

    @Override
    public String getOnTransaction() {
        return null;
    }
}
